www.gusucode.com > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序 > VC++ 仿SQLServer企业管理器的SQL客户端工具-源码程序/code/tabDesc.cpp

    //Download by http://www.NewXing.com
#include "stdafx.h"
#include "sql.h"
#include "sqlext.h"
#include "FTDB.h"
#include "tabDesc.h"


CTabDesc::CTabDesc()
{
}

CTabDesc::~CTabDesc()
{
}

BOOL CTabDesc::DescTable(CFTDB* pDB,LPCSTR pszTableName)
{
	if(pDB->m_hdbc==NULL)
		return FALSE;
	HSTMT hstmt;
	RETCODE rt=SQLAllocStmt(pDB->m_hdbc,&hstmt);
	SQLSetStmtOption(hstmt,SQL_CONCURRENCY,SQL_CONCUR_READ_ONLY);
	SQLSetStmtOption(hstmt,SQL_CURSOR_TYPE,SQL_CURSOR_FORWARD_ONLY);
	if(!SQL_SUCC(rt))
		return FALSE;

	//char szSQL[100];
	//sprintf(szSQL,"desc %s",pszName);
	//rt=SQLExecDirect(hstmt,(UCHAR*)szSQL,strlen(szSQL));
	char szTName[300];
	sprintf(szTName,pszTableName);
	TRACE("desc table %s\n",szTName);
	rt=SQLColumns(hstmt,
					NULL,//qualifier
					0,
					NULL,//owner
					0,
					(UCHAR*)szTName,//table name
					SQL_NTS,
					NULL,
					0);


	int iTail=0;
	if(SQL_SUCC(rt))
	{
		m_arrColName.RemoveAll();
		m_arrColTypeName.RemoveAll();
		m_arrColDataLength.RemoveAll();
		m_arrColDataPrecision.RemoveAll();
		m_arrColDataScale.RemoveAll();
		m_arrColDataType.RemoveAll();
		m_arrColNullable.RemoveAll();

		char szColName[128],szTypeName[128];
		SDWORD cbDataType,cbDataPrecision,cbDataScale,cbDataLength,cbNullable;
		SDWORD cbT;

		SQLBindCol(hstmt, 4, SQL_C_CHAR, szColName, 128, &cbT);
		SQLBindCol(hstmt, 5, SQL_C_SLONG, &cbDataType, 0, &cbT);
		SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName, 128, &cbT);
		SQLBindCol(hstmt, 7, SQL_C_SLONG, &cbDataPrecision, 0, &cbT);
		SQLBindCol(hstmt, 8, SQL_C_SLONG, &cbDataLength, 0, &cbT);
		SQLBindCol(hstmt, 9, SQL_C_SSHORT, &cbDataScale, 0, &cbT); 
		SQLBindCol(hstmt, 11,  SQL_C_SSHORT, &cbNullable, 0, &cbT);

		rt = SQLFetch(hstmt);
		while (TRUE) 
		{
			if (SQL_SUCC(rt))
			{
				m_arrColName.Add(szColName);
				m_arrColTypeName.Add(szTypeName);
				m_arrColDataType.Add((DWORD)cbDataType);
				m_arrColDataPrecision.Add((DWORD)cbDataPrecision);
				m_arrColDataLength.Add((DWORD)cbDataLength);
				m_arrColDataScale.Add((DWORD)cbDataScale);
				m_arrColNullable.Add((DWORD)cbNullable);
				rt=SQLFetch(hstmt);
			} 
			else
				break;
		}
	}
	SQLFreeStmt(hstmt,SQL_CLOSE);

	return TRUE;
}

BOOL CTabDesc::GenerateDescString(CStringArray &arrRes)
{
	arrRes.RemoveAll();
	int iTotal=m_arrColName.GetUpperBound()+1;
	CString szT;
	for(int i=0;i<iTotal;i++)
	{
/*		DWORD dwType=m_arrColDataType.GetAt(i);
		switch(dwType)
		{
		case(SQL_DECIMAL):
		case(SQL_NUMERIC):
			if(m_arrColDataScale.GetAt(i)+m_arrColDataPrecision.GetAt(i) 
				> m_arrColDataLength.GetAt(i)+1)
				szT.Format("%s %s (%d)",
						m_arrColName.GetAt(i),
						m_arrColTypeName.GetAt(i),
						m_arrColDataPrecision.GetAt(i));
			else
				szT.Format("%s %s (%d.%d)",
						m_arrColName.GetAt(i),
						m_arrColTypeName.GetAt(i),
						m_arrColDataPrecision.GetAt(i),
						m_arrColDataScale.GetAt(i));
			break;
		case(SQL_CHAR):
		case(SQL_VARCHAR):
			szT.Format("%s %s (%d)",
					m_arrColName.GetAt(i),
					m_arrColTypeName.GetAt(i),
					m_arrColDataLength.GetAt(i));
			break;
		default:
			szT.Format("%s %s",m_arrColName.GetAt(i),m_arrColTypeName.GetAt(i));
			break;
		}*/
		szT.Format("%s %s",m_arrColName.GetAt(i),m_arrColTypeName.GetAt(i));
		arrRes.Add(szT);
	}
	return iTotal;

}